package com.kexio.security.service;

import java.util.List;

import com.kexio.common.dto.PageRequest;
import com.kexio.common.dto.PageResponse;
import com.kexio.security.dto.UserDTO;
import com.kexio.security.dto.UserRequest;

/**
 * 用户业务服务接口
 * 
 * @author kexio
 */
public interface UserService {

    /**
     * 创建用户
     * @param request 用户创建请求
     * @return 用户DTO
     */
    UserDTO createUser(UserRequest request);

    /**
     * 更新用户
     * @param request 用户更新请求
     * @return 用户DTO
     */
    UserDTO updateUser(UserRequest request);

    /**
     * 根据ID获取用户
     * @param id 用户ID
     * @return 用户DTO
     */
    UserDTO getUserById(Long id);

    /**
     * 根据用户名获取用户
     * @param username 用户名
     * @return 用户DTO
     */
    UserDTO getUserByUsername(String username);

    /**
     * 分页查询用户
     * @param request 查询条件
     * @param pageRequest 分页参数
     * @return 分页结果
     */
    PageResponse<UserDTO> queryUsers(UserRequest request, PageRequest pageRequest);

    /**
     * 根据部门ID查询用户
     * @param deptId 部门ID
     * @return 用户列表
     */
    List<UserDTO> getUsersByDeptId(Long deptId);

    /**
     * 根据角色ID查询用户
     * @param roleId 角色ID
     * @return 用户列表
     */
    List<UserDTO> getUsersByRoleId(Long roleId);

    /**
     * 启用用户
     * @param id 用户ID
     * @return 是否成功
     */
    boolean enableUser(Long id);

    /**
     * 禁用用户
     * @param id 用户ID
     * @return 是否成功
     */
    boolean disableUser(Long id);

    /**
     * 重置密码
     * @param id 用户ID
     * @param newPassword 新密码
     * @return 是否成功
     */
    boolean resetPassword(Long id, String newPassword);

    /**
     * 修改密码
     * @param id 用户ID
     * @param oldPassword 旧密码
     * @param newPassword 新密码
     * @return 是否成功
     */
    boolean changePassword(Long id, String oldPassword, String newPassword);

    /**
     * 删除用户
     * @param id 用户ID
     * @return 是否成功
     */
    boolean deleteUser(Long id);

    /**
     * 批量删除用户
     * @param ids 用户ID列表
     * @return 删除数量
     */
    int deleteUsers(List<Long> ids);

    /**
     * 分配角色
     * @param userId 用户ID
     * @param roleIds 角色ID列表
     * @return 是否成功
     */
    boolean assignRoles(Long userId, List<Long> roleIds);

    /**
     * 移除角色
     * @param userId 用户ID
     * @param roleIds 角色ID列表
     * @return 是否成功
     */
    boolean removeRoles(Long userId, List<Long> roleIds);

    /**
     * 获取用户角色
     * @param userId 用户ID
     * @return 角色ID列表
     */
    List<Long> getUserRoles(Long userId);

    /**
     * 更新最后登录信息
     * @param userId 用户ID
     * @param loginIp 登录IP
     * @return 是否成功
     */
    boolean updateLastLoginInfo(Long userId, String loginIp);

    /**
     * 验证用户密码
     * @param username 用户名
     * @param password 密码
     * @return 是否验证成功
     */
    boolean validatePassword(String username, String password);

    /**
     * 检查用户名是否存在
     * @param username 用户名
     * @param excludeId 排除的用户ID
     * @return 是否存在
     */
    boolean existsByUsername(String username, Long excludeId);

    /**
     * 检查邮箱是否存在
     * @param email 邮箱
     * @param excludeId 排除的用户ID
     * @return 是否存在
     */
    boolean existsByEmail(String email, Long excludeId);

    /**
     * 检查手机号是否存在
     * @param phone 手机号
     * @param excludeId 排除的用户ID
     * @return 是否存在
     */
    boolean existsByPhone(String phone, Long excludeId);
}
